package com.xhy.tool.aop;

import com.xhy.tool.annotation.After;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * Author: Xhy
 * CreateTime: 2022-06-13 09:50
 * 使用方法：
 * 1.创建一个类实现 AfterAdvice 接口
 * 2.切入目标方法需有返回值，返回数据以及数据相关类即可
 * 3.在具体实现类中的方法进行操作
 */
@Component
@Aspect
public class AfterAdviceAop {

    @Around("@annotation(after)")
    public void around(ProceedingJoinPoint joinPoint, After after) throws IllegalAccessException, InstantiationException {

        // 获取具体实现类
        Class clazz = after.value();

        // 实例化类
        Object object = clazz.newInstance();

        try {
            // 获取目标方法返回值
            Object data = joinPoint.proceed();
            // 调用方法
            Method method = clazz.getDeclaredMethod("afterAdvice", Object.class);
            method.invoke(object,data);
        } catch (Exception e) {
           e.printStackTrace();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
